#ifndef __DOUBLE_LINKEDLIST_H__
#define __DOUBLE_LINKEDLIST_H__


// 变长结构体，最后一个元素一定是一个数组
typedef struct dlist_t {
    struct dlist_t *prev, *next;
    char data[0]; // 0个或者一个元素（编译器不支持0个就设置为1个元素）
} dlist_t;

typedef struct dlisthead_t {
    dlist_t node;
    int size;
    int nmemb;
} dlisthead_t;


int dlisthead_init(dlisthead_t **mylist, int size);                             // 初始化头节点

int dlist_empty(const dlisthead_t *mylist);                                     // 链表空

int dlist_insert(dlisthead_t *mylist, const void *data);                        // 头插数据

int dlist_insert_tail(dlisthead_t *mylist, const void *data);                   // 尾插数据

void *dlist_search(const dlisthead_t *mylist, const void *key, \
        int (*cmp)(const void *data, const void *key));                         // 查找元素

void *find_center_node(const dlisthead_t *mylist);                              // 查找中心节点

void reverse_list(dlisthead_t *mylist);                                         // 反转链表

int dlist_delete(dlisthead_t *mylist, const void *key, \
        int (*cmp)(const void *data, const void *key));                         // 删除元素

int dlist_fetch(dlisthead_t *mylist, const void *key, \
        int (*cmp)(const void *data, const void *key), void *data);             // 删除并回填数据

void dlist_traval(const dlisthead_t *mylist, void (*pri)(const void *data));    // 遍历链表

void dlist_destroy(dlisthead_t **mylist);                                       // 销毁链表

#endif
